package com.wnxy.jdk8.demo;

import java.util.concurrent.RecursiveTask;

//RecursiveTask代表有返回值的任务
//RecursiveAction代表没有返回值的任务。
//CountedCompleter 在任务完成执行后会触发执行一个自定义的钩子函数
class ForkJoinSumTask extends RecursiveTask<Long> {
    private Long start;
    private Long end;
    // 临界值
    private Long temp = 100000L;
    public ForkJoinSumTask(Long start,Long end){
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        if ((end-start) < temp) {
            Long sum = 0L;
            for (Long i = start; i <= end ; i++) {
                sum+=i;
            }
            return sum;
        } else {
            Long middle = (start + end) / 2;
            ForkJoinSumTask task1 = new ForkJoinSumTask(start,middle);
            ForkJoinSumTask task2 = new ForkJoinSumTask(middle+1,end);
            // 执行子任务
            task1.fork();
            task2.fork();
            // 等待任务执行结束合并其结果
            return task1.join() + task2.join();
        }
    }
}